use std::fs;
use std::path::Path;
use serde::{Deserialize, Serialize};
use log::{info, error};

// 内核配置结构
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct KernelConfig {
    pub kernel_type: String,
    pub cpu_cores: u32,
    pub memory_mb: u32,
}

// 系统配置结构
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct SystemConfig {
    pub kernels: Vec<KernelConfig>,
}

impl Default for SystemConfig {
    fn default() -> Self {
        Self {
            kernels: vec![
                KernelConfig { kernel_type: "main".to_string(), cpu_cores: 2, memory_mb: 512 },
                KernelConfig { kernel_type: "app1".to_string(), cpu_cores: 1, memory_mb: 256 },
                KernelConfig { kernel_type: "app2".to_string(), cpu_cores: 1, memory_mb: 256 },
            ],
        }
    }
}

impl SystemConfig {
    // 保存配置到JSON文件
    pub fn save_to_json(&self, path: &Path) -> Result<(), String> {
        let config_json = serde_json::to_string_pretty(self)
            .map_err(|e| format!("JSON序列化失败: {:?}", e))?;
        
        fs::write(path, config_json)
            .map_err(|e| format!("无法写入配置文件: {:?}", e))?;
        
        info!("配置文件已保存到: {:?}", path);
        Ok(())
    }
    
    // 从JSON文件加载配置
    pub fn load_from_json(path: &Path) -> Result<Self, String> {
        if !path.exists() {
            return Err(format!("配置文件不存在: {:?}", path));
        }
        
        let config_json = fs::read_to_string(path)
            .map_err(|e| format!("无法读取配置文件: {:?}", e))?;
        
        let config = serde_json::from_str(&config_json)
            .map_err(|e| format!("JSON反序列化失败: {:?}", e))?;
        
        info!("配置文件已从: {:?} 加载", path);
        Ok(config)
    }
    
    // 生成Chym内核入口文件
    pub fn generate_kernel_entry(&self, path: &Path) -> Result<(), String> {
        let mut entry_content = String::new();
        
        // 使用原始字符串字面量避免转义问题
        entry_content.push_str(r#"#!chim
"#);
        entry_content.push_str(r#"// Chym 内核配置文件 (由 OS Design Studio 自动生成)
"#);
        entry_content.push_str(r#"
"#);
        entry_content.push_str(r#"模块 Chym
"#);
        entry_content.push_str(r#"
"#);
        entry_content.push_str(r#"导入 内核启动 为 boot
"#);
        entry_content.push_str(r#"导入 输入输出 为 io
"#);
        entry_content.push_str(r#"导入 日志
"#);
        entry_content.push_str(r#"
"#);
        entry_content.push_str(r#"函数 主函数() {
"#);
        entry_content.push_str(r#"    使用 Parker多内核启动方案配置 {
"#);
        
        // 生成内核配置
        for (i, kernel) in self.kernels.iter().enumerate() {
            let kernel_type = if kernel.kernel_type == "main" {
                "主内核"
            } else {
                "应用内核"
            };
            
            entry_content.push_str(&format!(r#"        // {}: {} ({}核/{}MB)
"#, 
                kernel.kernel_type, kernel_type, kernel.cpu_cores, kernel.memory_mb));
            entry_content.push_str(&format!(r#"        {}{{
"#, kernel.kernel_type));
            entry_content.push_str(&format!(r#"            核数: {};
"#, kernel.cpu_cores));
            entry_content.push_str(&format!(r#"            内存: {};
"#, kernel.memory_mb));
            entry_content.push_str(r#"        }};
"#);
        }
        
        // 生成文件尾部
        entry_content.push_str(r#"    }
"#);
        entry_content.push_str(r#"    
"#);
        entry_content.push_str(r#"    日志.调试("开始启动Chym...");
"#);
        entry_content.push_str(r#"    
"#);
        entry_content.push_str(r#"    尝试 {
"#);
        entry_content.push_str(r#"        boot.启动();
"#);
        entry_content.push_str(r#"    } 捕获 错误 {
"#);
        entry_content.push_str(r#"        日志.错误("启动失败: {}", 错误);
"#);
        entry_content.push_str(r#"        io.输出("Chym 启动失败. 错误信息: {}", 错误);
"#);
        entry_content.push_str(r#"    }
"#);
        entry_content.push_str(r#"    
"#);
        entry_content.push_str(r#"    io.输出("Chym 启动完成.");
"#);
        entry_content.push_str(r#"}
"#);
        
        // 写入文件
        fs::write(path, entry_content)
            .map_err(|e| format!("无法写入内核入口文件: {:?}", e))?;
        
        info!("内核入口文件已生成到: {:?}", path);
        Ok(())
    }
}

// 测试生成的配置文件
#[cfg(test)]
mod tests {
    use super::*;
    use std::env;
    
    #[test]
    fn test_generate_kernel_entry() {
        let config = SystemConfig::default();
        let temp_dir = env::temp_dir();
        let entry_path = temp_dir.join("内核入口.chim");
        
        let result = config.generate_kernel_entry(&entry_path);
        assert!(result.is_ok(), "生成内核入口文件失败: {:?}", result.err());
        
        // 验证文件内容
        let content = fs::read_to_string(entry_path).unwrap();
        assert!(content.contains("// main: 主内核 (2核/512MB)"));
        assert!(content.contains("// app1: 应用内核 (1核/256MB)"));
        assert!(content.contains("// app2: 应用内核 (1核/256MB)"));
        
        // 清理临时文件
        fs::remove_file(entry_path).unwrap();
    }
}
